package condominio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import condominio.modelo.Vivienda;
//import java.util.ArrayList;
//import java.util.Collection;

import condominio.excepcion.DAOExcepcion;
//import condominio.modelo.Residente;
//import condominio.modelo.Estacionamiento;
import condominio.util.ConexionBD;

public class ViviendaDAO extends BaseDAO {

	public int insertVivienda(Vivienda oVivienda) throws DAOExcepcion {
		int i = 0;
		System.out.println("ViviendaDAO: insertar(Vivienda oVivienda)");
		String query = "INSERT INTO Vivienda(NuNroVivienda,TxUbicacion," +
				"QtMetraje,FlTipoVivienda ) VALUES (?,?,?,?)";

		if (findViviendaNro(oVivienda.getNroVivienda()) !=null ) {			
			throw new DAOExcepcion("Nro de vivienda ya existe.");
		}
		
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.getConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, oVivienda.getNroVivienda());
			stmt.setString(2, oVivienda.getUbicacion());
			stmt.setDouble(3, oVivienda.getMetraje());
			stmt.setString(4, oVivienda.getTipo());
			i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException();
			}
		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return i;
	}

	public Vivienda findViviendaNro(int nuNroVivienda) throws DAOExcepcion {
		System.out.println("ViviendaDAO: findVivienda(int NuVivienda)");
		Vivienda oVivienda = null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT * FROM VIVIENDA WHERE NuNroVivienda = ?";
			con = ConexionBD.getConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, nuNroVivienda);
			rs = stmt.executeQuery();
			if (rs.next()) {
				oVivienda = new Vivienda();
				oVivienda.setCodigo(rs.getInt("CoVivienda"));
				oVivienda.setNroVivienda(rs.getInt("NuNroVivienda"));
				oVivienda.setUbicacion(rs.getString("TxUbicacion"));
				oVivienda.setMetraje(rs.getDouble("QtMetraje"));
				oVivienda.setTipo(rs.getString("FlTipoVivienda"));
			}
		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return oVivienda;
	}	

	public Vivienda findVivienda(int coVivienda) throws DAOExcepcion {
		System.out.println("ViviendaDAO: findVivienda(int NuVivienda)");
		Vivienda oVivienda = null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT * FROM VIVIENDA WHERE coVivienda = ?";
			con = ConexionBD.getConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, coVivienda);
			rs = stmt.executeQuery();
			if (rs.next()) {
				oVivienda = new Vivienda();
				oVivienda.setCodigo(rs.getInt("CoVivienda"));
				oVivienda.setNroVivienda(rs.getInt("NuNroVivienda"));
				oVivienda.setUbicacion(rs.getString("TxUbicacion"));
				oVivienda.setMetraje(rs.getDouble("QtMetraje"));
				oVivienda.setTipo(rs.getString("FlTipoVivienda"));
			}else{
				throw new DAOExcepcion("No existe ninguna vivienda.");
			}
		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return oVivienda;
	}	

	public Collection<Vivienda> listar() throws DAOExcepcion {
		System.out.println("ViviendaDAO: listar()");
		Collection<Vivienda> c = new ArrayList<Vivienda>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.getConexion();
			String query = "SELECT CoVivienda, NuNroVivienda, TxUbicacion, QtMetraje,FlTipoVivienda  from Vivienda";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Vivienda oVivienda = new Vivienda();

				oVivienda.setCodigo(rs.getInt("CoVivienda"));
				oVivienda.setNroVivienda(rs.getInt("NuNroVivienda"));
				oVivienda.setUbicacion(rs.getString("TxUbicacion"));
				oVivienda.setMetraje(rs.getDouble("QtMetraje"));
				oVivienda.setTipo(rs.getString("FlTipoVivienda"));
				c.add(oVivienda);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}	
	
	public Collection<Vivienda> listarViviendaResidente() throws DAOExcepcion {
		System.out.println("ViviendaDAO: listar()");
		Collection<Vivienda> c = new ArrayList<Vivienda>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.getConexion();
			String query = "select vivienda.CoVivienda, vivienda.NuNroVivienda, vivienda.TxUbicacion, vivienda.QtMetraje,vivienda.FlTipoVivienda from vivienda inner join residente on vivienda.CoVivienda=residente.CoVivienda";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Vivienda oVivienda = new Vivienda();

				oVivienda.setCodigo(rs.getInt("CoVivienda"));
				oVivienda.setNroVivienda(rs.getInt("NuNroVivienda"));
				oVivienda.setUbicacion(rs.getString("TxUbicacion"));
				oVivienda.setMetraje(rs.getDouble("QtMetraje"));
				oVivienda.setTipo(rs.getString("FlTipoVivienda"));
				c.add(oVivienda);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
}